#!/usr/bin/env python
# -*- coding: UTF-8 -*-
"""
@Project ：python_learning 
@File ：文件读取.py
@IDE  ：PyCharm 
@Author ：李涵彬
@Date ：2024/12/29 12:38 
"""

import os
import pandas as pd
import json
import xml.etree.ElementTree as ET


class FileReader:
	def __init__(self, file_path: str):
		"""
		初始化文件读取器。

		:param file_path: 要读取的文件路径。
		"""
		self.file_path = self._validate_file_path(file_path)
		self.file_type = self._get_file_type()

	def _validate_file_path(self, file_path: str) -> str:
		"""
		验证文件路径是否有效。

		:param file_path: 要验证的文件路径。

		:return: 有效的文件路径。
		"""
		if not os.path.exists(file_path):
			print("提供的文件路径不存在。")
			raise FileNotFoundError("文件路径不存在。")
		return file_path

	def _get_file_type(self) -> str:
		"""
		根据文件路径获取文件类型。

		:return: 文件扩展名。
		"""
		_, file_extension = os.path.splitext(self.file_path)
		return file_extension.lower()

	def read_file(self) -> any:
		"""
		根据文件类型读取文件，并返回相应的数据。

		:return: 根据文件类型返回的数据。
		"""
		try:
			if self.file_type == '.txt':
				return self._read_txt()
			elif self.file_type in ['.xlsx', '.xls']:
				return self._read_excel()
			elif self.file_type == '.json':
				return self._read_json()
			elif self.file_type == '.xml':
				return self._read_xml()
			else:
				raise ValueError(f"不支持的文件类型：{self.file_type}")
		except Exception as e:
			print(f"发生错误：{e}")

	def _read_txt(self, encoding: str = 'utf-8') -> str:
		"""
		读取文本文件。

		:param encoding: 文件编码，默认为 utf-8。

		:return: 文件内容。
		"""
		try:
			with open(self.file_path, 'r', encoding=encoding) as file:
				return file.read()
		except IOError as e:
			print(f"读取文件时发生I/O错误：{e}")

	def _read_excel(self, sheet_name: int = 0, header: int = 0) -> pd.DataFrame:
		"""
		读取Excel文件。

		:param sheet_name: 工作表名称，默认为第一个工作表。
		:param header: 表头行数，默认为第一行。

		:return: DataFrame格式的数据。
		"""
		try:
			return pd.read_excel(self.file_path, sheet_name=sheet_name, header=header)
		except ValueError as e:
			print(f"解析Excel文件时出错：{e}")
		except Exception as e:
			print(f"读取Excel文件时发生错误：{e}")

	def _read_json(self) -> dict:
		"""
		读取JSON文件。

		:return: 字典格式的数据。
		"""
		try:
			with open(self.file_path, 'r', encoding='utf-8') as file:
				return json.load(file)
		except json.JSONDecodeError as e:
			print(f"解析JSON文件时出错：{e}")

	def _read_xml(self) -> ET.Element:
		"""
		读取XML文件。

		:return: ElementTree的根元素。
		"""
		try:
			tree = ET.parse(self.file_path)
			return tree.getroot()
		except ET.ParseError as e:
			print(f"解析XML文件时出错：{e}")


# 示例用法：
try:
	file_reader = FileReader('test.txt')
	data = file_reader.read_file()
	print(data)
except FileNotFoundError as e:
	print(e)
